/**
 * Description:
 * Class Name:GenericTest
 * Date:2022/5/1 14:10
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第18章_类加载机制与反射._18_6_反射和泛型._18_6_2_使用反射来获取泛型信息;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

public class GenericTest {
    private Map<String, Integer> score;

    public static void main(String[] args) throws Exception{
        Class<GenericTest> clazz = GenericTest.class;
        Field f = clazz.getDeclaredField("score");

        // 若使用getType()来直接取出类型只会对普通类型的成员变量有效
        Class<?> a = f.getType();
        // 下面将看到仅输出java.util.Map
        System.out.println("score的类型是：" + a);
        // 获得成员变量f的泛型类型
        Type gType = f.getGenericType();
        if (gType instanceof ParameterizedType){
            // 强制类型转换
            var pType = (ParameterizedType)gType;
            // 强制类型转换后就可以使用ParameterizedType 的两个方法：getRawType()和getActualArguments()
            Type rType = pType.getRawType();
            System.out.println("原始类型是：" + rType);
            // 取得泛型类型的泛型参数
            Type[] tArgs = pType.getActualTypeArguments();
            System.out.println("泛型信息是：");
            int i=0;
            for (var x:
                 tArgs) {
                System.out.println("第" + ++i + "个泛型类型是：" + x);
            }
        }
        else {
            System.out.println("获取泛型类型出错！");
        }
    }
}
//score的类型是：interface java.util.Map
//原始类型是：interface java.util.Map
//泛型信息是：
//第1个泛型类型是：class java.lang.String
//第2个泛型类型是：class java.lang.Integer